﻿/**  
  \brief КЛассы для описания сущности "пользователь".

*/


#pragma once

#include "core_api.h"
#include "common_types.h"
#include <time.h>

#include "date.h"
#include "error.h"
#include "VectorDll.h"

 
//#define USEF_INFO_VERSION  0

//-------------------------------------------------------------------------

//! \brief Уровень изученности английского слова.
struct  CORE_API word_learn_level_e
{

	enum e
	{
		undef = 0,   ///< Уровень знаний не определён.

		none,   ///<   Знаний о слове нет.
		low,    ///<   Знание слова очень низкое, но все же знакомо.
		aver,   ///<   Слово знает, но может быть забыто.
		hi,     ///<   Очень высокое знание слова, но со временем не забудется.
		perfect ///<   Слово уже никогда не забудется (you, I, the и тому подобные).

	};

	e value;



	static size_t GetNumEnumValues()
	{
		size_t res = 5;
		assert( res == (size_t)perfect );
		return res;
	}

	word_learn_level_e()
	{
		GetNumEnumValues();
		value = undef;
	}

	word_learn_level_e(const word_learn_level_e& a )
	{
		GetNumEnumValues();
		value = a.value;
	}

	bool operator ==  (const e& val)
	{
		return value == val;
	}


	bool from_cstr(const char* str) throw (Error) ;

	void to_cstr(char* dest) const    throw (Error) ;


};

//-------------------------------------------------------------------------

//! \brief   Информация по изучению слова. Тут всё по слову, по по процессу его изучения.
class  CORE_API user_learnword_info
{
private:

	word_learn_level_e   m_word_learn_level_e;



public:



	//! default constructor
	user_learnword_info()
	{

	}

};

//-------------------------------------------------------------------------

const unsigned int USERIFON_CURRENT_VERSION = 0;

//! \brief  Информация аользователя, которая загружается из файла и сохраняется в файл.
class  CORE_API UserInfo
{
private:
	std::wstring          m_fullpath;
	VectorDLL<user_learnword_info>  m_vector_user_learnword_info;


public:

	UserInfo(const std::wstring& fullpath)  throw(Error);
	UserInfo(const std::wstring& directory,  const std::string& user_name)  throw(Error);

	~UserInfo()
	{
		Save();
	}

	void Load()  throw(Error);
	void Save() throw(Error);

	std::string GetUserName() const;
	std::wstring GetFullPath() const
	{
		return m_fullpath;
	}


};

//------------------------------------------------------------------------

//! \brief  Список для  UserInfo
class   CORE_API  UserInfoList 
{
private:
	std::wstring m_directory;
	std::vector<UserInfo*>*   m_list;


public:

	UserInfoList(const std::wstring& directory) throw(Error);

	~UserInfoList() ;

	size_t GetNumUsers() const 
	{
		return m_list->size();
	}

	UserInfo* GetUser(size_t index)
	{
		return m_list->at(index);
	}

	//!  \brief Получить индекс пользователя. Если не найден то вернёт  минус 1 .
	int GetUserIndex(const std::string& user_name) const;

	bool IsUserExists(const std::string& user_name) const;

	UserInfo*  AddUser(const std::string& user_name) throw(Error);
	//UserInfo*  AddUser(const std::wstring& fullpath) throw(Error);

	void DeleteUser(const std::string& username) throw(Error);


	//! \brief  make   User0 \n User 1\n User2 \n ...
	std::string MakeUsersLine() const;

	std::string GetUserNameIndex(size_t index) throw(Error);


};





